

package com.mt.common.system.controller;

import com.mt.common.core.annotation.ApiPageParam;
import com.mt.common.core.utils.ScheduledUtils;
import com.mt.common.core.web.base.PageDTO;
import com.mt.common.core.web.base.PageResultDTO;
import com.mt.common.system.dto.system.ScheduledTaskEditDto;
import com.mt.common.system.entity.ScheduledTask;
import com.mt.common.system.service.ScheduledTaskService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.quartz.SchedulerException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;


@Api(tags = "定时任务")
@RestController
@RequestMapping("/api/system/scheduledTask/ScheduledTask")
@CrossOrigin(allowCredentials = "true")
public class ScheduledTaskController {
    private static Logger logger = LoggerFactory.getLogger(ScheduledTaskController.class);


    @Autowired
    private ScheduledTaskService scheduledTaskService;

    /**
     * 根据分页参数查询定时任务集合
     *
     * @param pageDTO 分页条件
     */
    @PreAuthorize("hasAuthority('system:scheduledTask:ScheduledTask:view')")
    @ApiOperation("分页查询定时任务")
    @ApiPageParam
    @PostMapping("/findScheduledTasks")
    public PageResultDTO findScheduledTasks(@RequestBody PageDTO pageDTO) {
        return this.scheduledTaskService.findScheduledTasks(pageDTO);
    }

    /**
     * 根据ID查询指定的定时任务
     *
     * @param scheduledTaskId Id
     */
    @PreAuthorize("hasAuthority('system:scheduledTask:ScheduledTask:view')")
    @ApiOperation("根据id查询定时任务")
    @ApiPageParam
    @PostMapping("/findScheduledTask")
    public ScheduledTask findScheduledTask(@RequestParam Long scheduledTaskId) {
        return this.scheduledTaskService.findScheduledTask(scheduledTaskId);
    }

    /**
     * 根据ID查询指定的定时任务(包含外键名称)
     *
     * @param scheduledTaskId Id
     */
    @PreAuthorize("hasAuthority('system:scheduledTask:ScheduledTask:view')")
    @ApiOperation("根据ID查询指定的定时任务(包含外键名称)")
    @PostMapping("/findScheduledTaskForView")
    public ScheduledTask findScheduledTaskForView(@RequestParam Long scheduledTaskId) {
        return this.scheduledTaskService.findScheduledTaskWithForeignName(scheduledTaskId);
    }

    /**
     * 根据ID查询指定的定时任务(包含定时任务和外键名称)
     *
     * @param scheduledTaskId Id
     */
    @PreAuthorize("hasAuthority('system:scheduledTask:ScheduledTask:view')")
    @ApiOperation("根据ID查询指定的定时任务(包含定时任务和外键名称)")
    @PostMapping("/findScheduledTaskForEdit")
    public ScheduledTaskEditDto findScheduledTaskForEdit(@RequestParam Long scheduledTaskId) {
        ScheduledTaskEditDto scheduledTaskEditDto = new ScheduledTaskEditDto();
        scheduledTaskEditDto.setScheduledTask(this.scheduledTaskService.findScheduledTaskWithForeignName(scheduledTaskId));

        this.prepareScheduledTaskEditDto(scheduledTaskEditDto);

        return scheduledTaskEditDto;
    }

    /**
     * 根据ID查询指定的定时任务(只提取ID 和 Name)
     *
     * @param scheduledTaskId Id
     */
    @PreAuthorize("hasAuthority('system:scheduledTask:ScheduledTask:view')")
    @ApiOperation("根据ID查询指定的定时任务(只提取ID 和 Name)")
    @PostMapping("/findScheduledTasksWithIdNameById")
    public ScheduledTask findScheduledTasksWithIdNameById(@RequestParam Long scheduledTaskId) {
        return this.scheduledTaskService.findScheduledTasksWithIdNameById(scheduledTaskId);
    }

    /**
     * 根据名称查询定时任务集合(只提取ID 和 Name)
     *
     * @param scheduledTaskName 名称
     */
    @PreAuthorize("hasAuthority('system:scheduledTask:ScheduledTask:view')")
    @ApiOperation("根据名称查询定时任务集合(只提取ID 和 Name)")
    @PostMapping("/findScheduledTasksWithIdNameByName")
    public List<ScheduledTask> findScheduledTasksWithIdNameByName(@RequestParam String scheduledTaskName) {
        return this.scheduledTaskService.findScheduledTasksWithIdNameByName(scheduledTaskName);
    }


    /**
     * 创建新的定时任务
     */
    @PreAuthorize("hasAuthority('system:scheduledTask:ScheduledTask:add')")
    @ApiOperation("创建新的定时任务")
    @PostMapping("/createScheduledTask")
    public ScheduledTaskEditDto createScheduledTask() {
        ScheduledTaskEditDto scheduledTaskEditDto = new ScheduledTaskEditDto();
        scheduledTaskEditDto.setScheduledTask(new ScheduledTask());

        this.prepareScheduledTaskEditDto(scheduledTaskEditDto);
        return scheduledTaskEditDto;
    }

    private void prepareScheduledTaskEditDto(ScheduledTaskEditDto scheduledTaskEditDto) {
    }

    /**
     * 新增保存定时任务
     *
     * @param scheduledTask 实体对象
     */
    @PreAuthorize("hasAuthority('system:scheduledTask:ScheduledTask:add')")
    @ApiOperation("新增保存定时任务")
    @PostMapping("/saveScheduledTask")
    public ScheduledTask saveScheduledTask(@RequestBody ScheduledTask scheduledTask) throws SchedulerException {
        return this.scheduledTaskService.saveScheduledTask(scheduledTask);
    }

    /**
     * 修改保存定时任务
     *
     * @param scheduledTask 实体对象
     */
    @PreAuthorize("hasAuthority('system:scheduledTask:ScheduledTask:update')")
    @ApiOperation("修改保存定时任务")
    @PostMapping("/updateScheduledTask")
    public ScheduledTask updateScheduledTask(@RequestBody ScheduledTask scheduledTask) {
        return this.scheduledTaskService.updateScheduledTask(scheduledTask);
    }

    /**
     * 根据ID删除定时任务
     *
     * @param
     */
    @PreAuthorize("hasAuthority('system:scheduledTask:ScheduledTask:remove')")
    @ApiOperation("根据ID删除定时任务")
    @PostMapping("/deleteScheduledTask")
    public void deleteScheduledTask(@RequestParam String jobName,@RequestParam String groupName) {
        this.scheduledTaskService.deleteScheduledTask(jobName,groupName);
    }

    @ApiOperation("暂停任务")
    @PostMapping("/pauseJob")
    public void pauseJob(@RequestParam String jobName,@RequestParam String groupName) {
        this.scheduledTaskService.pauseJob(jobName,groupName);
    }

    @ApiOperation("恢复任务")
    @PostMapping("/resumeJob")
    public void resumeJob(@RequestParam String jobName,@RequestParam String groupName) {
        this.scheduledTaskService.resumeJob(jobName,groupName);
    }

    @ApiOperation("暂停所有任务")
    @PostMapping("/pauseAllJobs")
    public void pauseAllJobs() {
        this.scheduledTaskService.pauseAllJobs();
    }

    @ApiOperation("恢复所有任务")
    @PostMapping("/resumeAllJobs")
    public void resumeAllJobs() {
        this.scheduledTaskService.resumeAllJobs();
    }
    @PostMapping("/findServices")
    public Map<String,List<String>> findServices() {
        return ScheduledUtils.serviceMap;
    }

}

